Skip to content

Latest commit

 

History

History
170 lines (136 loc) · 4.52 KB

设计模式 - 中介者.md

File metadata and controls

170 lines (136 loc) · 4.52 KB

5. 中介者(Mediator)

Intent

集中相关对象之间复杂的沟通和控制方式。

Class Diagram

  • Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。
  • Colleague:同事,相关对象

Implementation

Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事件产生时需要去操作其它对象,形成了下面这种依赖结构:


使用中介者模式可以将复杂的依赖结构变成星形结构:


publicabstractclassColleague { publicabstractvoidonEvent(Mediatormediator); }
publicclassAlarmextendsColleague { @OverridepublicvoidonEvent(Mediatormediator) { mediator.doEvent("alarm"); } publicvoiddoAlarm() { System.out.println("doAlarm()"); } }
publicclassCoffeePotextendsColleague { @OverridepublicvoidonEvent(Mediatormediator) { mediator.doEvent("coffeePot"); } publicvoiddoCoffeePot() { System.out.println("doCoffeePot()"); } }
publicclassCalenderextendsColleague { @OverridepublicvoidonEvent(Mediatormediator) { mediator.doEvent("calender"); } publicvoiddoCalender() { System.out.println("doCalender()"); } }
publicclassSprinklerextendsColleague { @OverridepublicvoidonEvent(Mediatormediator) { mediator.doEvent("sprinkler"); } publicvoiddoSprinkler() { System.out.println("doSprinkler()"); } }
publicabstractclassMediator { publicabstractvoiddoEvent(StringeventType); }
publicclassConcreteMediatorextendsMediator { privateAlarmalarm; privateCoffeePotcoffeePot; privateCalendercalender; privateSprinklersprinkler; publicConcreteMediator(Alarmalarm, CoffeePotcoffeePot, Calendercalender, Sprinklersprinkler) { this.alarm = alarm; this.coffeePot = coffeePot; this.calender = calender; this.sprinkler = sprinkler; } @OverridepublicvoiddoEvent(StringeventType) { switch (eventType) { case"alarm": doAlarmEvent(); break; case"coffeePot": doCoffeePotEvent(); break; case"calender": doCalenderEvent(); break; default: doSprinklerEvent(); } } publicvoiddoAlarmEvent() { alarm.doAlarm(); coffeePot.doCoffeePot(); calender.doCalender(); sprinkler.doSprinkler(); } publicvoiddoCoffeePotEvent() { // ... } publicvoiddoCalenderEvent() { // ... } publicvoiddoSprinklerEvent() { // ... } }
publicclassClient { publicstaticvoidmain(String[] args) { Alarmalarm = newAlarm(); CoffeePotcoffeePot = newCoffeePot(); Calendercalender = newCalender(); Sprinklersprinkler = newSprinkler(); Mediatormediator = newConcreteMediator(alarm, coffeePot, calender, sprinkler); // 闹钟事件到达,调用中介者就可以操作相关对象alarm.onEvent(mediator); } }
doAlarm() doCoffeePot() doCalender() doSprinkler()

JDK

close